package main.java;

import java.util.Stack;

/**
 * @program: pratice
 * @author: 关键我是大怪
 * @create: 2021-07-25 20:36
 */
public class Test07_用两个栈实现队列 {

    /**
     * 题目：
     * 用两个栈实现一个队列。队列的声明如下，请实现它的两个函数appendTail和deleteHead，
     * 分别完成在队列尾部插入整数和在队列头部删除整数的功能。
     * (若队列中没有元素，deleteHead 操作返回 -1 )
     * <p>
     * <p>
     * 思路：
     * 这题就是完成队列的先进先出
     * 因此要保证第一个插入的尾部的数字 会第一个被删除
     * 因此用两个栈来实现这一操作
     * stack1只负责插入操作
     * 而stack2负责删除操作
     * 但需要删除时，先检查stack2中是否为空
     * 若为null则将stack1中的数字全部出栈，然后stack2入栈 再执行删除
     * 然后stack1底部的最先入栈的数字将会第一个在Stack2中被删除
     * 实现先进先出
     */


    class CQueue {
        Stack<Integer> stack1;
        Stack<Integer> stack2;

        public CQueue() {
            stack1 = new Stack<>();
            stack2 = new Stack<>();

        }

        public void appendTail(int value) {
            stack1.add(value);
        }

        public int deleteHead() {
            //将stack1中的数字压入stack2中
            if (stack2.isEmpty()) {
                while (!stack1.isEmpty()) {
                    stack2.add(stack1.pop());
                }
            }
            //若此时stack2还为空，说明stack1中也不存在数字，直接返回-1
            if (stack2.isEmpty()) {
                return -1;
            } else {
                //删除顶部元素
                return stack2.pop();
            }

        }
    }

}
